/*
* JAVIER ANTON DIAZ DNI:48629698Q
* STANISLAV LITVINENKO DNI:02062226T
*/

#include <iostream>
#include "DibujoSVG.h"
#include "Figura2D.h"
#include "IDibujable.h"
//#include "ExcepcionSVG.h"

using namespace std;


Figura2D::Figura2D( Coordenada porigen, int grosor, Color fondo, Color linea )
{
	try
	{
		origen = porigen;
		colorFondo = fondo;
		colorLinea = linea;
		agrupada=false;
		if ( grosor > 0)
		{
			grosorLinea = grosor;
		}
		else
		{ 
			throw ExcepcionValorNoValido(grosor, "ExcepcionValorNoValido: el grosor de la figura debe ser positivo");
		}
	}
	catch (ExcepcionValorNoValido &e)
	{
	}
}
Figura2D::~Figura2D()
{
}
Figura2D::Figura2D( const Figura2D &f)
{
	if ( this != &f)
	{
		grosorLinea = f.grosorLinea;
		colorFondo = f.colorFondo;
		colorLinea = f.colorLinea;
		agrupada = f.agrupada;
	}
}


Figura2D&
Figura2D::operator =(const Figura2D &f)
{
	if(this != &f)
	{
		origen=f.origen;
		grosorLinea = f.grosorLinea;
		colorFondo = f.colorFondo;
		colorLinea = f.colorLinea;
		agrupada = f.agrupada;
	}
	return *this;
}

Coordenada
Figura2D::getOrigen() const
{
	return origen;
}

Color
Figura2D::getFondo() const
{
	return colorFondo;
}

Color
Figura2D::getLinea() const
{
	return colorLinea;
}

int
Figura2D::getGrosorLinea() const
{
	return grosorLinea;
}

bool
Figura2D::esAgrupada() const
{
	return agrupada;
}

Coordenada
Figura2D::mover(const Coordenada &porigen )
{
	Coordenada aux;

	aux = origen;
	origen = porigen;

	return aux;
}

void
Figura2D::setFondo( Color pfondo )
{
	if ( pfondo >= 0 && pfondo <= 16 )
	{
		colorFondo = pfondo;
	}
	else
	{
		throw ExcepcionValorNoValido(pfondo, "ExcepcionValorNoValido: el valor del fondo es invalido."); 
	}
}

void
Figura2D::setLinea( Color plinea )
{

	if ( plinea >=0 && plinea <= 16 )
	{
		colorLinea = plinea;
	}
	else
	{
		throw ExcepcionValorNoValido(plinea, "ExcepcionValorNoValido: el valor del fondo es invalido.");
	}
}

void
Figura2D::setGrosorLinea( int pgrosor )
{
	if ( pgrosor >= 0)
	{
		grosorLinea = pgrosor;
	}
	else
	{
		throw ExcepcionValorNoValido(pgrosor, "ExcepcionValorNoValido: el valor del fondo es invalido.");
	}
}

void
Figura2D::setAgrupada( bool d)
{
	agrupada = d;
}

bool
Figura2D::puedoPintarme() const
{
	bool ret = false;

	if ( agrupada == false ) ret = true;

	return ret;
}

void
Figura2D::pintar( ostream &os) const
{
	string aux="",aux2="";
	if(colorLinea > 16 || colorFondo > 16)
	{
		throw ExcepcionValorNoValido(colorLinea,"Vaya color...");
	}
	switch(colorLinea)
	{
		case 0:
			aux = "none";
			break;
		case 1:
			aux = "black";
			break;
		case 2:
			aux = "silver";
			break;
		case 3:
			aux = "gray";
			break;
		case 4:
			aux = "white";
			break;
		case 5:
			aux = "maroon";
			break;
		case 6:
			aux = "red";
			break;
		case 7:
			aux = "purple";
			break;
		case 8:
			aux = "fuchsia";
			break;
		case 9:
			aux = "green";
			break;
		case 10:
			aux = "lime";
			break;
		case 11:
			aux = "olive";
			break;
		case 12:
			aux = "yellow";
			break;
		case 13:
			aux = "navy";
			break;
		case 14:
			aux = "blue";
			break;
		case 15:
			aux = "teal";
			break;
		case 16:
			aux = "aqua";
			break;
	}
	switch(colorFondo)
	{
		case 0:
			aux2 = "none";
			break;
		case 1:
			aux2 = "black";
			break;
		case 2:
			aux2 = "silver";
			break;
		case 3:
			aux2 = "gray";
			break;
		case 4:
			aux2 = "white";
			break;
		case 5:
			aux2 = "maroon";
			break;
		case 6:
			aux2 = "red";
			break;
		case 7:
			aux2 = "purple";
			break;
		case 8:
			aux2 = "fuchsia";
			break;
		case 9:
			aux2 = "green";
			break;
		case 10:
			aux2 = "lime";
			break;
		case 11:
			aux2 = "olive";
			break;
		case 12:
			aux2 = "yellow";
			break;
		case 13:
			aux2 = "navy";
			break;
		case 14:
			aux2 = "blue";
			break;
		case 15:
			aux2 = "teal";
			break;
		case 16:
			aux2 = "aqua";
			break;
	}

	if(aux2!="none")
	{
		os << " fill=\"" << aux2 << "\"";
	}
	if(aux!="none")
	{
		os << " stroke=\"" << aux << "\"" ;
	}
	os << " stroke-width=\"" << grosorLinea << "\"";
}

void
Figura2D::leeEntrada(istream &is)
{
	float x,y;
	int grosor,fondoaux,lineaaux;
	string error="";

	is>>x;
	is>>y;
	is>>grosor;
	is>>fondoaux;

        if(fondoaux < 17)
        {
        	this->setFondo((Color)fondoaux);
        }
	else 
	{
		throw ExcepcionValorNoValido(fondoaux,"color invalido");
	}
	if(x>DibujoSVG::MAX_VALOR || x<DibujoSVG::MIN_VALOR || y>DibujoSVG::MAX_VALOR || y<DibujoSVG::MIN_VALOR)
	{
		throw ExcepcionCoordenadaErronea(x,y);
	}
	grosorLinea = grosor;

	is>>lineaaux;
	
        if(lineaaux<17)
        {
		this->setLinea((Color)lineaaux);
        }
	else
	{
		throw ExcepcionValorNoValido(lineaaux,"color invalido");
	}

	try
	{
		if(origen.getX() <=DibujoSVG::MAX_VALOR && origen.getX() >=DibujoSVG::MIN_VALOR && origen.getY() <=DibujoSVG::MAX_VALOR && origen.getY() >=DibujoSVG::MIN_VALOR)
		{
			Coordenada coor(x,y);
			this->origen = coor;
		}
		else
		{
			throw ExcepcionCoordenadaErronea( x, y );
		}
	}
	catch( ExcepcionCoordenadaErronea &c)
	{
		c.what();
	}
	/*try
	{
		if (fondo >= 0 && fondo <= 16)
		{
			colorFondo = (Color)fondo;
		}
		else
		{
			error = "ExccepcionValorNoValido: valor del fondo invalido";
			throw ExcepcionValorNoValido(fondo,error);
		}
	}
	catch( ExcepcionValorNoValido &v)
	{
		v.what();
	}
	try
	{
		if (linea >= 0 && linea <= 16)
		{
			colorLinea = (Color)linea;
		}
		else
		{
			error = "ExccepcionValorNoValido: valor de linea invalido";
			throw ExcepcionValorNoValido(linea,error);
		}
	}
	catch( ExcepcionValorNoValido &v)
	{
		v.what();
	}*/
}
Figura2D* 
Figura2D::duplicar(const Coordenada &nuevoOrigen)
{
	Figura2D* fig;
	fig = dynamic_cast<Figura2D*>(this->clonar());
	fig->mover(nuevoOrigen);

	return fig;
}

ostream&
operator<<( ostream &os, const Figura2D &c)
{
	os << "stroke-width=\"" << c.grosorLinea;
	if(c.colorLinea!=0)
	{
		os << "\" stroke=\"" << c.colorLinea;
	}
	if(c.colorFondo!=0)
	{
		os << "\" fill=\"" << c.colorFondo << "\"";
	}
	return os;
}

